package com.xgf.common.xgfcommon.data.algorithm;


/**
* @Title: BitMap的实现方式
* 应用场景：标签,主要是解决大数据量的 去重 求交集 并集等操作
* @ClassName:  BitMapUtils   
* @Description:TODO  
* @author: xgf
* @date:   2020年3月2日 下午5:10:40   
* @since   JDK1.8
* @history 2020年3月2日 TODO 新建
*/
public class BitMapUtils {
	
	private long[] words;
	
	private int size;
	
	public static void main(String[] args) {
		BitMapUtils bitMapUtils = new BitMapUtils(10);
		bitMapUtils.setBit(5);
		bitMapUtils.setBit(2);
		System.out.println(bitMapUtils.getBit(5));
		System.out.println(bitMapUtils.getBit(3));
	}

	public BitMapUtils(int size) {
		this.size = size;
		this.words = new long[(getWordIndex(size -1) + 1)];
	}
	
	public boolean getBit(int bitIndex) {
		if(bitIndex < 0 ||bitIndex > size -1) {
			throw new IndexOutOfBoundsException("超过BitMap的有效范围");
		}
		int wordIndex = getWordIndex(bitIndex);
		return (words[wordIndex] & (1L << bitIndex)) != 0;
	}
	
	/**
	 * 设置指定的位
	* @Title: setBit
	* @Description: TODO
	* @param @param bitIndex 
	* @return void
	* @throws
	 */
	public void setBit(int bitIndex) {
		if(bitIndex < 0 ||bitIndex > size -1) {
			throw new IndexOutOfBoundsException("超过BitMap的有效范围");
		}
		int wordIndex = getWordIndex(bitIndex);
		System.out.println(wordIndex);
		words[wordIndex] |=  (1L << bitIndex);
	}

	private int getWordIndex(int bitIndex) {
		//相当于除以64 这是为什么呢？因为 一个long 占用64位
		return bitIndex >> 6;
	}
	
	
	
	
	

}
